/**
 * @file server.hpp
 * @brief WebSocket服务器核心类的声明
 * @details 实现了游戏服务器的核心功能，包括：
 *          - WebSocket连接管理
 *          - 消息处理和路由
 *          - 会话状态维护
 *          - 用户认证和授权
 */

#pragma once

#include <libwebsockets.h>
#include <string>
#include <functional>
#include <map>
#include <memory>
#include <nlohmann/json.hpp>
#include "../models/user.hpp"
#include "message_router.hpp"
#include "../database/redis_manager.hpp"

/**
 * @class Server
 * @brief WebSocket服务器类，使用单例模式
 * @details 该类是游戏服务器的核心，负责处理所有的网络通信和会话管理。
 *          使用单例模式确保全局只有一个服务器实例。
 */
class Server {
public:
    /**
     * @brief 获取Server单例实例
     * @return Server& 服务器的单例引用
     */
    static Server& getInstance();

    /**
     * @brief 初始化WebSocket服务器
     * @return bool 初始化是否成功
     * @details 创建libwebsockets上下文，设置监听端口和协议
     */
    bool init();

    /**
     * @brief 启动服务器主循环
     * @details 持续运行服务器，处理连接和消息，直到收到停止信号
     */
    void run();

    /**
     * @brief 运行服务器一次迭代
     * @return bool 运行是否成功
     * @details 执行一次服务循环，处理待处理的事件
     */
    bool runOnce();

    /**
     * @brief 停止服务器
     * @details 优雅地关闭服务器，清理资源
     */
    void stop();

    /**
     * @brief 检查服务器是否正在运行
     * @return bool 运行状态
     */
    bool isRunning() const { return running_; }

    /**
     * @brief WebSocket回调函数
     * @param wsi WebSocket实例
     * @param reason 回调原因
     * @param user 用户数据
     * @param in 输入数据
     * @param len 数据长度
     * @return int 处理结果
     * @details 处理WebSocket事件，包括：
     *          - 连接建立和断开
     *          - 消息接收
     *          - 错误处理
     */
    static int wsCallback(struct lws *wsi, enum lws_callback_reasons reason,
                         void *user, void *in, size_t len);

    /**
     * @brief 处理接收到的消息
     * @param wsi WebSocket实例
     * @param message 消息内容
     * @details 解析JSON消息，根据消息类型路由到相应的处理函数
     */
    void handleMessage(struct lws *wsi, const std::string& message);

    /**
     * @brief 发送消息给客户端
     * @param wsi WebSocket实例
     * @param message 消息内容
     * @details 将消息通过WebSocket发送给指定的客户端
     */
    void sendMessage(struct lws *wsi, const std::string& message);

    // 设置shutdown callback
    void setShutdownCallback(std::function<void()> callback);
    
private:
    // 私有构造和析构函数，确保单例模式
    Server() = default;
    ~Server();
    Server(const Server&) = delete;
    Server& operator=(const Server&) = delete;

    struct lws_context *context_ = nullptr;  ///< WebSocket上下文
    bool running_ = false;                   ///< 服务器运行状态
    int signal_pipe_[2];                     /// 信号管道
    std::function<void()> shutdown_callbacks_;  /// 关闭的回调

    /**
     * @brief 注册消息处理器
     * @details 注册所有消息处理器到MessageRouter
     */
    void registerMessageHandlers();

    /**
     * @brief 处理用户注册请求
     * @param wsi WebSocket实例
     * @param data JSON格式的请求数据
     * @details 验证用户数据，创建新用户，返回注册结果
     */
    void handleRegister(struct lws *wsi, const nlohmann::json& data);

    /**
     * @brief 处理用户登录请求
     * @param wsi WebSocket实例
     * @param data JSON格式的请求数据
     * @details 验证用户凭证，创建会话，返回登录结果和令牌
     */
    void handleLogin(struct lws *wsi, const nlohmann::json& data);

    /**
     * @brief 处理用户登出请求
     * @param wsi WebSocket实例
     * @param data JSON格式的请求数据
     * @details 清理用户会话，返回登出结果
     */
    void handleLogout(struct lws *wsi, const nlohmann::json& data);

    std::map<struct lws*, std::shared_ptr<User>> sessions_;  ///< 会话存储：WebSocket实例到用户对象的映射

    /**
     * @brief 添加用户会话
     * @param wsi WebSocket实例
     * @param user 用户对象
     * @details 将用户会话信息存储在内存中
     */
    void addSession(struct lws* wsi, std::shared_ptr<User> user);

    /**
     * @brief 移除用户会话
     * @param wsi WebSocket实例
     * @details 清理指定的用户会话
     */
    void removeSession(struct lws* wsi);

    /**
     * @brief 获取用户会话
     * @param wsi WebSocket实例
     * @return std::shared_ptr<User> 用户对象指针，如果会话不存在则返回nullptr
     * @details 根据WebSocket实例获取对应的用户信息
     */
    std::shared_ptr<User> getSession(struct lws* wsi);
}; 